/****************************************************************************
**
** Copyright (C) 2011 Jesús Martínez Pérez
**
** This program is free software: you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the 
** Free Software Foundation, either version 3 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but 
** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along 
** with this program. If not, see <http://www.gnu.org/licenses/>
**
****************************************************************************/
/*
 * deflate.h
 *
 *		Created on: 22/05/2010
 *		Author: Jesús Martínez Pérez
 */
#ifndef _DEFLATE_H_
#define _DEFLATE_H_
#include <lz77.h>
#include <iostream>
#include <tabla.h>
using namespace std;
/**
 * \class Deflate
 *
 *
 * \brief	Esta clase hace permite realizar la lectura de la salida de un objeto de la clase 
 				LZ77, codificarla mediante las distintas tablas y finalmente agrupar
 				el contenido en un vector de bits (Vbits).
 *         
 *
 * \author Jesús Martínez Pérez 
 *
 *
 * \date $Date: 22/05/2010 $
 *
 */
class Deflate{
	private:
		LZ77 lz;
		Vbits vb;
	public:
/**
@brief Constructor por defecto
*/
		Deflate();
/**
@brief	Constructor por parametros
@param[in] v1 un vector de bits
@param[in] l un objeto de la clase LZ77
*/
   	Deflate(Vbits v1,LZ77 l);
/**
@brief Consulta el tamaño del vector de bits que contiene el objeto de la clase Deflate
@return Un entero
*/	
		int Size()const;
/**
@brief Consulta el tamaño del vector dinámico de unsigned char que contiene el 
		objeto LZ77 del objeto de la clase Deflate
@return Un entero
*/	
		int tamano()const;
/**
@brief Realiza la codificación LZ77 sobre el objeto LZ77 del objeto Deflate
*/	
		void CodLZ();
/**
@brief Metodo encargado de leer el vector dinámico de unsigned int del objeto
		LZ77, lo codifica mediante el uso de las tablas y almacena en el vector de bits 
  		del objeto de la clase Deflate.
*/
		void CodDeflate();
/**
@brief Consultar el valor al que pertenece una posición en el vector de bits del objeto de la clase Deflate
@param[in] pos La posición que queremos consultar
@return El valor unsigned char que tiene el vector de bits en la posición indicada
*/
		unsigned char GetB(int pos)const;
/**
@brief Realiza el algoritmo CRC32 a el vector dinámico de unsigned char
		 que hay en el LZ77 del objeto de la clase Deflate
@return Un valor unsigned int que es solucion de aplicar el algoritmo crc32
*/
		unsigned int CRC32()const;
/**
@brief Consulta el objeto de la clase LZ77 que hay en el objeto de la clase Deflate 
@return Un objeto de la clase LZ77
*/	
		LZ77 GetLZ()const;
/**
@brief Consulta el vector de bits que hay en el objeto de la clase Deflate 
@return Un vector de bits
*/	
		Vbits GetVb()const;
/** 
@brief Sobrecarga del operador de entrada
*/
		friend istream & operator>>(istream & is,Deflate & def);
/** 
@brief Sobrecarga del operador de salida
*/
		friend ostream & operator<<(ostream & os,Deflate & def);
};
#endif

